package 剑指offer;

public class _22链表中倒数第k个节点 {
	/**
	 * 
	 *@time 2021年2月4日下午1:32:26
	 * 
	 *@param head
	 *@param k
	 *@return ListNode
	 *
	 *@see 双指针的方法求解该问题、不考虑越界问题,相差二直接通过
	 */
	 public ListNode getKthFromEnd(ListNode head, int k) {
		
		ListNode pre=head,last=head;
		for (int i = 0; i < k; i++) {
			pre=pre.next;
		}
		while(pre!=null) {
			last=last.next;
			pre=pre.next;
		}
					 
		 return last;

	    }
	 /**
	  * 
	  *@time 2021年2月4日下午1:44:45
	  * 
	  *@param head
	  *@param k
	  *@return ListNode
	  *1.head为空指针；
	  *2.k大于链表的长度；
	  *3.输入的参数k为0； 鲁棒性也是很重要的~
	  *@see 考虑越界问题
	  */
	 public ListNode getKthFromEnd1(ListNode head, int k) {
		 ListNode former = head, latter = head;
		 if(head == null || k == 0) //考虑特殊情况1、3
	            return null;
	        for(int i = 0;i<k;i++)
	        {
	            if(former == null && i<k) //考虑特殊情况2
	                return null;
	            former = former.next;
	        }
	        while(former!=null) {
	        	latter=latter.next;
	        	former=former.next;
	        }
			return latter;
	 }
	 
}

